home *** CD-ROM | disk | FTP | other *** search
-
- % Demonstration für Prolog :
-
- % QUICKSORT -- Sortieren von Listen, deren Elemente Integerzahlen sind
-
- % Quelle : Prolog-Kursus 1985, TH Darmstadt
- % (vermutlich mehr oder weniger direkt aus dem Clocksin/Mellish)
-
- % Dieses Beispiel zeigt sehr deutlich, wie man in Prolog Probleme,
- % die in anderen Programmiersprachen (wie z.B. Pascal) ziemlich komplex
- % werden, auf einfache (einfachste ?) Weise lösen kann.
-
- % Aufruf der Funktion :
-
- % qsort(Unsortierte_Liste, Sortierte_Liste)
-
- %------------------------------------------------------------------------
-
- % Definition des Prädikates 'qsort' :
-
- qsort([], []). % Die leere Liste ist schon sortiert.
-
- qsort([K | R], E) :- % Das erste Element einer nichtleeren Liste wird benutzt,
- split(R, K, E1, E2), % ... um die Liste in zwei Teillisten zu spalten,
- % von denen E1 die Elemente <= K und E2 die
- % Elemente > K enthält.
-
- qsort(E1, S1), % Die beiden Teillisten werden getrennt sortiert.
- qsort(E2, S2),
-
- append(S1, [K | S2], E). % Die sortierten Teillisten (und das ehemalige
- % erste Element) werden zusammengefügt.
-
-
- % Definition des Prädikates 'split' :
-
- split([], _, [], []). % Die leere Liste läßt sich nicht spalten.
-
- split([X | R], K, [X | E1], E2) :- X =< K, % Erstes Element <= K :
- % einfügen in erste Teilliste.
- split(R, K, E1, E2). % Rest der Liste aufspalten.
-
- split([X | R], K, E1, [X | E2]) :- X > K, % Erstes Element > K :
- % einfügen in zweite Teilliste.
- split(R, K, E1, E2). % Rest der Liste aufspalten.
-
-
- % Definition des Prädikates 'append' :
-
- append([], L, L) :- !.
- append([K | R], L, [K | RL]) :- append(R, L, RL).
-
- %-----------------------------------------------------------------------
-
- % Mit dem folgenden Prädikat kann man die Geschwindigkeit des Sortierens
- % prüfen :
-
- % Man ruft statt ' qsort(..., ...) ' das Praädikat ' qtest(..., ...) ' auf.
- % 'qtest' gibt unmittelbar VOR und NACH dem Sortieren je ein Klingelzeichen
- % aus. Der Abstand der beiden Töne entspricht der benötigten Zeit.
-
- qtest(X, Y) :- bell, qsort(X, Y), bell.
-
- end.
-
-